﻿#region 참조 네임스페이스

using System;
using System.IO;
using System.Reflection;

#endregion

namespace Skying.Diagnostics.Logger.Configuration
{
	/// <summary>
	/// 로거에 대한 어플리케이션 설정 정보를 정의한다.
	/// </summary>
	/// <remarks>
	/// <para>어플리케이션의 AssemblyInfo에 등록하기 위한 <see cref="System.Attribute"/>로 사용한다.</para>
	/// </remarks>
	[AttributeUsage(AttributeTargets.Assembly)]
	public class LoggerSettings : Attribute
	{
		#region 상수

		/// <summary>
		/// 환경 설정 기본 경로 상수를 나타낸다. 이 디렉토리는 상대 경로를 나타낸다.
		/// </summary>
		private const string _CONFIGURATION_DEFAULT_DIRECTORY = "config";

		/// <summary>
		/// 환경 설정 파일명 기본 접두사 상수를 나타낸다.
		/// </summary>
		private const string _CONFIGURATION_FILE_NAME_PREFIX = "Skying.logger";

		#endregion

		#region 프로퍼티

		/// <summary>
		/// 환경 설정의 절대 경로를 가져온다.
		/// </summary>
		public string ConfigPath
		{
			get;
			private set;
		}

		/// <summary>
		/// 환경 설정 파일의 절대 경로를 가져온다.
		/// </summary>
		public string ConfigFilePath
		{
			get;
			private set;
		}

		#endregion

		#region 생성자/소멸자

		internal LoggerSettings()
			: this(_CONFIGURATION_DEFAULT_DIRECTORY, _CONFIGURATION_FILE_NAME_PREFIX)
		{
			
		}

		public LoggerSettings(string configPath, string configFilePrefix = _CONFIGURATION_FILE_NAME_PREFIX)
		{
			// 실행 중인 프로세스의 어셈블리 정보를 가져온다.
			AssemblyName assemblyName = Assembly.GetEntryAssembly().GetName();

			// 절대 경로가 아닌 경우, 실행 경로의 상대 경로로 환경 설정 경로를 만들어 저장한다.
			if (!Path.IsPathRooted(configPath))
			{
				configPath = string.Format(@"{0}\{1}", Path.GetDirectoryName(assemblyName.CodeBase), configPath);
			}

			this.ConfigPath = new Uri(configPath).LocalPath;
			
			// 환경 설정 경로가 존재하지 않는 경우 경로를 생성한다.
			if (!Directory.Exists(this.ConfigPath))
			{
				Directory.CreateDirectory(this.ConfigPath);
			}

			this.ConfigFilePath = string.Format(@"{0}\{1}-{2}.xml", this.ConfigPath, configFilePrefix, assemblyName.Name);
		}

		#endregion
	}
}